package com.example.handle;

import com.alibaba.fastjson2.JSONObject;
import com.example.entity.Result;
import com.example.utils.MyJwtUtils;
import com.example.utils.MyThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Component
public class MyLoginInterceptor implements HandlerInterceptor {
    @Autowired
    private MyJwtUtils myJwtUtils;
    //每次浏览器请求时都会执行此方法（路径正确），true->放行，false->拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("自定义的spring的拦截器执行了................");
        //2.根据请求头Token获取令牌
        String token = request.getHeader("Token");
        //3.判断令牌是否合法，令牌合法则放行，令牌不合法则响应错误状态对象
        Map<String,Object> map = myJwtUtils.parseJwt(token);
        if(map==null){
            //说明令牌过期或不合法，直接响应错误信息
            //ThreadLocal 存储数据，线程安全
            Result<Object> result = Result.error("NOT_LOGIN_ERROR");
            //令牌不合法时，把result响应给前端（把对象转Json，并手动响应数据）
            String jsonString = JSONObject.toJSONString(result);
            response.getWriter().println(jsonString);
            return false;//不放行


        }
        //合法的，把用户信息保存到ThreadLocal中，便于后续使用
        MyThreadLocalUtils.setValue(map);
        return true;
    }
}
